package startupcompanymanager2012.minigames.tictactoe;

// TTTFileIO.java
// Klasse zum Laden und Speichern von TTT-Spielstaenden
import java.awt.*; // FileDialog
import java.io.*;  // FileInputStream, ...

public class TTTFileIO {
	TTTFileIO() {
	}
	
	public static void spielLaden(TTT ttt) {
		// Spiel laden
		File f;
		// File Dialog zum Laden erzeugen und anzeigen
		FileDialog fd = new FileDialog(ttt, "Spiel laden ...",FileDialog.LOAD);
		fd.show();
		
		try {
			// FileInputStream, BufferedInputStream zur Datei f.getPath() erzeugen
			if (fd.getFile() == null) return; // Keine Datei ausgew�hlt 
			else f = new File(fd.getDirectory(), fd.getFile());
			FileInputStream iStream = new FileInputStream(f.getPath());
			BufferedInputStream iBufStream = new BufferedInputStream(iStream);
			
			// Spielstand in String spielStand einlesen
			String spielStand = new String("");
			byte teil[] = new byte[256];
			int anzGeleseneBytes = 0;
			while(iBufStream.available() > 0) {
				anzGeleseneBytes = iBufStream.read(teil);
				spielStand += new String(teil,0,anzGeleseneBytes);
			}
				
			// Spielfeld entsprechend geladenem spielStand vorbereiten
			// Initialisieren als neues Spiel
			ttt.neuesSpiel();
			
			// Felder mit ttt.tttboard.setzeFeld(...) auf "X", "O" oder "" setzen
			int anzX = 0;
			int anzO = 0;
			for (int feld=0; feld<9; feld++) {
				if (spielStand.charAt(feld) == 'X') {
					ttt.spielfeld[feld] = TTT.SPIELER_X;
					ttt.tttboard.setzeFeld(feld, TTT.SPIELER_X);
					anzX++;
				} else if (spielStand.charAt(feld) == 'O') {
					ttt.spielfeld[feld] = TTT.SPIELER_O;
					ttt.tttboard.setzeFeld(feld, TTT.SPIELER_O);
					anzO++;
				} else {
					ttt.spielfeld[feld] = TTT.LEER;
					ttt.tttboard.setzeFeld(feld, TTT.LEER);
				}
			}
			
			// ttt.anzahlGespielteZuege aktualisieren
			ttt.anzahlGespielteZuege = anzX + anzO;
			
			// ttt.aktuellerSpieler aktualisieren
			if (anzO > anzX) ttt.aktuellerSpieler = TTT.SPIELER_X;
			else if (anzO < anzX) ttt.aktuellerSpieler = TTT.SPIELER_O;
			
			// testen, ob Spiel schon fertig ist und in diesem Fall
			// verhindern, dass ein fertiges Spiel weitergespielt werden kann
			if (ttt.istSpielFertig() != TTT.UNKLAR)	{				
				ttt.status = ttt.FERTIG;
			}
		} catch (IOException ioEvent) {
			// Fehler-Meldung als Dialogbox anzeigen
			TTTDialog dateiFehler = new TTTDialog(ttt, "Dateifehler", true, ioEvent.toString(), "OK");
			dateiFehler.setSize(400,120);
			dateiFehler.show();
		}
	}
	
	public void spielSpeichern(TTT ttt) {
		// Spiel speichern
		File f;
		// File Dialog zum Speichern erzeugen und anzeigen
		FileDialog fd = new FileDialog(ttt, "Spiel speichern ...",FileDialog.SAVE);
		fd.show();
			
		if (fd.getFile() == null) return; // Keine Datei ausgew�hlt 
		else f = new File(fd.getDirectory(), fd.getFile());			
		// Spielstand der Felder 0 bis 8 im String spielStand codieren
		// Bsp. spielStand=="XXOOXX O ", wenn ein X oben links steht und in unterster
		// Zeile noch links und rechts aussen ein freies Feld ist
		String spielStand = new String("");
		for (int feld=0; feld<9; feld++) {
			if (ttt.spielfeld[feld] == TTT.SPIELER_X) {
				spielStand += new String("X");
			} else if (ttt.spielfeld[feld] == TTT.SPIELER_O) {
				spielStand += new String("O");
			} else {
				spielStand += new String(" ");
			}
		}
			
		try {
			// FileOutputStream, BufferedOutputStream zur Datei f.getPath() erzeugen
			FileOutputStream oStream = new FileOutputStream(f.getPath());
			BufferedOutputStream oBufStream = new BufferedOutputStream(oStream);
			
			// String spielStand speichern und File schliessen
			oBufStream.write(spielStand.getBytes());
			oBufStream.flush();
			oBufStream.close();
		} catch (IOException ioEvent) {
			// Fehler-Meldung als Dialogbox anzeigen
			TTTDialog dateiFehler = new TTTDialog(ttt, "Dateifehler", true, ioEvent.toString(), "OK");
			dateiFehler.setSize(400,120);
			dateiFehler.show();
		}
	}
}
	

